Welcome to Django!

1.5 创建第一个web页面

1. 为什么了解URL

URL 即统一资源定位符,它是用来表示互联网上的某个资源地址,互联网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。URL 最初是由蒂姆·伯纳斯·李发明的,并使用它作为万维网的地址,现在它已经被万维网联盟编制为互联网标准 RFC1738。

学习本节知识为下一节的内容打下铺垫,在 Django 中就是通过 URL 配置来实现页面访问的。无论用什么 URL 地址访问 Web 站点资源,都需要开发者对 URL 地址进行设计,所以学习本节知识是必需的!

2. URL语法格式详解

URL 的语法格式为:

protocol://hostname[:port]/path[?query][#fragment]

请看下面的例子:

https://www.baidu.com/movie/movieshow?id=234&number=1314#name

我们对上述语法格式做简单说明:

1) protocol(协议)

protocol 是指网络传输协议,以下是经常用到的几个协议:

http,通过 HTTP 协议访问该资源,格式 http://;

https,通过安全的 HTTPS 协议访问该资源, 格式 https://;

file,资源是本地计算机上的文件,格式 file:///;

ftp,通过 FTP访问资源,格式 FTP://。

2) hostname(主机名)

是指存放资源的服务器的域名、主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码 (格式:username:password@hostname)。

3) port(端口号)

port 是一个可选的整数,它的取值范围 是 0-65535。如果 port 被省略时就使用默认端口, 各种传输协议都有默认的端口号,如 http 的默认端口为 80,https 的端口是 443。

4) path(路由地址)

由零个或多个/符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。路由地址决定了服务端如何处理这个请求。

5) query (查询)

从?开始到#为止,它们之间的部分就是参数,又称搜索部分或者查询字符串。这个部分允许有多个参数,参数与参数之间用&作为分隔符。 本例的参数部分为id=234&number=1314。

6) fragment(信息片断)

它用于指定网络资源中的片断,例如一个网页中有多个名词解释,那么可使用 fragment 直接对它们定位。例子中的信息片段是#后的 name。 #代表网页中的一个位置而 name 就是这个位置的标志符号,当浏览器读取到上述 URL 后,浏览器将直接展示该位置。

本节对 URL 的基本语法进行了讲解。当然 URL 还有许多其它知识,比如,有些特殊的符号无法直接在 URL 中使用, 那么这时候需要用该符号对应的 ASCII 编码值,格式为%code,code 代表特殊符号的编码值


一个用户向 Web 站点发送请求,是通过 URL 实现的,当 Web 服务器端接收到用户请求后, 它又是怎么处理的呢?通过 MTV 的设计模式,我们可以得知,首先用户请求会到达相应的视图函数,那么视图函数又是怎样找到相应的访问资源的呢,在这里就用到了“路由系统”。

Django 中利用 ROOT_URLCONF 构建了 URL 与视图函数的映射关系。在 django.conf.urls 中封装了路由模块, 新建的 Django 项目中提供了 urls.py(创建项目后自动生成的配置文件) 路由配置文件,urls.py 文件中定义了一个 urlpatterns 的列表, 它是由 url( ) 实例对象组成的列表,Django 中 url 的定义就是在这个列表完成的。

1. from django.conf.urls import url

2. urlpatterns=[

3. url(r '^admin/',admin.site.urls),

4. ...

5. ]

后台 Admin 管理系统的路由就定义在了列表第一个位置,下面我们对路由的语法格进行简单说明:

1. url(regex,view,name=None)

上述 url 的参数解析如下:

regex,匹配请求路径,用正则表达式表示;

view,指定 regex 匹配路径所对应的视图函数的名称;

name,是给 url 地址起个别名,在模板反向解析的时候使用


配置第一个URL实现页面访问

在 urls.py 的同级目录下,新建 views.py 文件,把它作为编写视图函数的 View 层,然后在 views.py 中编写如下代码:

1. from django.http import HttpResponse

2. def page_view(request):

3. html='<h1>欢迎来到,C语言中文网,网址是http://c.biancheng.net</h>'

4. return HttpResponse(html)

假如现在有一个名叫 “myject”的 Django 项目,首先需要在 urls.py 文件中导入 views.py, 这么做的目的是把 URL 与视图层进行绑定,然后在 urls.py 的 urlpatterns 中编写如下代码:

1. from django.conf.urls import url

2. from django.contrib import admin

3. from myject import views

4. urlpatterns = [

5. url(r'admin/', admin.site.urls),

6. url(r'^page$/',views.page_view),]

上述代码解析:

代码的前 3 行分别对 URL 模块、admin 模块、以及视图层 views 做了导包操作;

路径地址被定义为 page,也就是在本机浏览器地址栏输入:http://127.0.0.1:8000/page 进行访问, views.page_view将 page/ 路径与对应的视图函数进行了关联。

那么通过上述的代码就完成了路由的配置。在项目运行后,通过访问对应的地址就可以得到相应的页面了,如下图所示:


视图是 MTV 设计模式中的 V 层,它是实现业务逻辑的关键层,可以用来连接 M 层与 T 层, 起着纽带般的作用,在《Django MTV和MVC的区别》中也做了相应的介绍,所以它的重要性可想而知。

1. 第一个视图函数

在 Django 中,视图函数是一个 Python 函数或者类,开发者主要通过编写视图函数来实现业务逻辑。 视图函数首先接受来自浏览器或者客户端的请求,并最终返回响应,视图函数返回的响应可以是 HTML 文件,也可以是 HTTP 协议中的 303 重定向。接下来编写一个简单的视图函数:

1. from django.http import HttpResponse

2. def Hello_my_django(request):

3. return HttpResponse('<html><body>Hello my Django</body></html>')

下面针对以上 3 行代码做解析:

1)HttpResponse视图响应类型

从 django.http 模块中导入 HttpResponse,从它简单的名字我们可以得知,它是一种视图的响应类型。

2)视图函数参数request

我们定义了一个名为“Hello_my_django”的函数,Django 规定了,视图函数至少有一个参数, 第一个参数必须是 request,request 是 HttpRequest 请求类型的对象,它携带了浏览器的请求信息,所以视图函数的第一个参数必须为 request。

3)return视图响应

视图函数要返回响应内容,这里的响应内容是我们用 HTML 标签编写的,把它作为 HttpResponse 的对象返回给浏览器。

2. 视图函数执行过程

上面视图函数的代码虽然区区几行,但是已经充分体现了视图层的实现过程。 Django 收到请求以后, 首先创建一个带有请求信息的 HttpRequset 对象,将 HttpRequest 的对象 request 作为第一个参数传递给视图函数, 视图接收参数后继续向下执行,然后选择加载对应的视图,最后返回 HttpResponse 对象给浏览器。


首先了解两个基本概念:路由器分发、视图

有这么一个场景,比如:我们在浏览器上访问: http://127.0.0.1:9090/home 这个网址,能看取网站的首页。

需要两个角色:

1、 路由分发,它负责识别不同的URL,第一个请求的地址是/about

2、 视图,负责处理某一个URL的请求,给用户响应内容

在django中,我们就是按照这个逻辑来实现这两个角色的,分两步操作

第1步,在shn.urls.py中编写一个视图(也叫视图函数)处理/home请求


from django.contrib import admin

from django.urls import path

from django.shortcuts import HttpResponse

#视图函数,必需有一个参数

def home(request):

return HttpResponse( "哈哈,这是一个网页,oygod")

urlpatterns = [

path('admin/', admin.site.urls),

path('home', home),

]

运行后地址是:http://127.0.0.1:8000/admin/login/?next=/admin/

返回值: